home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 8381 / 8381.xpi / chrome / content / webclipper / mac / mac-clip-to-evernote.js next >
Text File  |  2010-02-02  |  8KB  |  188 lines

  1. var enWebPersistenceThing;
  2. var enSaveFinishedInterval;
  3. var enSaveMainFile;
  4. var enDocumentToClip;
  5. var window_clipped_to_en;
  6.  
  7.  
  8. //dump("Loading mac clipper...\n");
  9.  
  10. // run through all children looking for image nodes.  make sure the newImage.src
  11. // is equal to the originalImage.src.  This would have been easier with XPaths or
  12. // NodeIterators but Firefox no support XPath queries on document fragments,
  13. // and NodeIterators are not available until Firefox 3.5
  14. // The assumption here is that the tree structure of the nodes match.
  15. function evernote_processImagesInNodes(originalNode, newNode) {
  16.   if (originalNode.nodeType == Node.ELEMENT_NODE &&
  17.       (originalNode.tagName == "img" || originalNode.tagName == "IMG")) {
  18.     // found an image, make sure the new one is an image too
  19.     if (newNode.nodeType == Node.ELEMENT_NODE &&
  20.         (newNode.tagName == "img" || newNode.tagName == "IMG")) {
  21.       //dump("Found an image node: " + originalNode +"\n");
  22.       newNode.src = originalNode.src;
  23.       return;
  24.     } else {
  25.       //dump("Found an image node but the new node doesn't match");
  26.       return;
  27.     }
  28.   }
  29.   
  30.   // these are not image nodes, recurse through the children
  31.   var origChild = originalNode.firstChild;
  32.   var newChild = newNode.firstChild;
  33.   while (origChild) {
  34.     evernote_processImagesInNodes(origChild, newChild);
  35.     origChild = origChild.nextSibling;
  36.     newChild = newChild.nextSibling;
  37.   }
  38. }
  39.  
  40.  
  41. // fallback to the javascript clipper
  42. function evernote_javascriptClipperFallback () {
  43.   window_clipped_to_en = document.commandDispatcher.focusedWindow;
  44.   EN_CLIP_HOST='http://www.evernote.com';
  45.   EN_clip(EN_CLIP_HOST);
  46. }
  47.  
  48.  
  49. function evernote_performClip(domElement) {
  50.   // check the OS version.  If we're on Leopard or later, we're ok.
  51.   // otherwise, fall-back to javascript clipper.
  52.   // at some point this should be written a little more intelligently.
  53.   if ((navigator.oscpu != "Intel Mac OS X 10.5") &&
  54.       (navigator.oscpu != "Intel Mac OS X 10.6"))
  55.   {
  56.     evernote_javascriptClipperFallback();
  57.     return true;
  58.   }
  59.   
  60.   try {
  61.     // make sure Evernote is installed
  62.     var enClipper = Components.classes["@evernote.com/ENMacMozillaClipper;1"].createInstance(Components.interfaces.EvernoteMacMozillaClipper);
  63.     var evernoteInstalled = 0;
  64.     if (!enClipper.evernoteInstalled(evernoteInstalled)) {
  65.       evernote_javascriptClipperFallback();
  66.       return true;
  67.     }
  68.     
  69.     // assume the whole document
  70.     enDocumentToClip = content.document;
  71.  
  72.     // FIXME:geech:2009-02-13 - break this logic into separate methods
  73.  
  74.     if (domElement && (domElement.tagName == "img" || domElement.tagName == "IMG")) {
  75.       // create a new document where we'll add just the image.
  76.       enDocumentToClip = content.document.implementation.createDocument (null, 'html', null);
  77.       enDocumentToClip.URL = content.document.URL;
  78.       var body = enDocumentToClip.createElementNS(null, 'body');
  79.       enDocumentToClip.documentElement.appendChild(body);
  80.       // import the image node to ur new document
  81.       var newImageNode = enDocumentToClip.importNode(domElement, true);
  82.       // set the 'src' property of the image node to match the original.  this will
  83.       // make the absolute URL of the image the same as the original. otherwise
  84.       // nsIWebBrowserPersist isn't always happy with relative image links.
  85.       // note that this is *not* the same as the src attribute.
  86.       newImageNode.src = domElement.src;
  87.       body.appendChild(newImageNode);
  88.     } else {
  89.       // look for non-collapsed selections
  90.       var sel = content.document.defaultView.getSelection();
  91.       var selCount = sel.rangeCount;
  92.       if (selCount >    0) {
  93.         var selectedContent = 0;
  94.         for (var i = 0; i < selCount; i++) {
  95.           var range = sel.getRangeAt(i);
  96.           if (!range.collapsed) {
  97.             selectedContent = 1;
  98.           }
  99.         }
  100.         
  101.         if (selectedContent) {
  102.           // we have at least one non-collapsed range selected, so clip the selected ranges instead of the whole doc
  103.           // first, create a document to hold the fragments
  104.           enDocumentToClip = content.document.implementation.createDocument (null, 'html', null);
  105.           enDocumentToClip.URL = content.document.URL;
  106.           var body = enDocumentToClip.createElementNS(null, 'body');
  107.           enDocumentToClip.documentElement.appendChild(body);
  108.           
  109.           // add the fragments
  110.           for (var i = 0; i < selCount; i++) {
  111.             var range = sel.getRangeAt(i);
  112.             var origFragment = range.cloneContents();
  113.             var newFragment = enDocumentToClip.importNode(origFragment, true);
  114.             evernote_processImagesInNodes(origFragment, newFragment);
  115.             body.appendChild(newFragment);
  116.           }
  117.         }
  118.       }
  119.     }
  120.     
  121.     // grab a reference to the temp dir
  122.     var tempDir = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile);
  123.     // create a temp dir in <tmp>/evernote-mac-clips/
  124.     tempDir.append("evernote-mac-clips");
  125.     tempDir.append("clip-tmp");
  126.     tempDir.createUnique(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0666);
  127.     
  128.     // our main file goes here
  129.     enSaveMainFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  130.     enSaveMainFile.initWithPath(tempDir.path);
  131.     enSaveMainFile.append("firefox-clip.html");
  132.     
  133.     // resources get stored here
  134.     var resourcesDir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  135.     resourcesDir.initWithPath(tempDir.path);
  136.     resourcesDir.append("resources");
  137.     
  138.     // start saving the document
  139.     //dump("Saving to "+enSaveMainFile.path+"\n");
  140.     enWebPersistenceThing = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);  
  141.     enWebPersistenceThing.saveDocument(enDocumentToClip, enSaveMainFile, resourcesDir, null, 0, 0);  
  142.  
  143.     // make sure we remove any currently running interval so we don't go into infinite clip land if the previous
  144.     // clip hasn't finished
  145.     if (enSaveFinishedInterval != null) {
  146.       clearInterval(enSaveFinishedInterval);
  147.       enSaveFinishedInterval = null;
  148.     }
  149.     // check every 250ms if the save has completed
  150.     enSaveFinishedInterval = setInterval("evernote_checkDocumentSaveStatus()", 250);
  151.     
  152.     return true;
  153.   } catch (e) {
  154.     dump("Exception trying to clip:" + e);
  155.   }
  156.   
  157.   // there was an exception of some sort during clipping, so fall back to the bookmarklet
  158.   evernote_javascriptClipperFallback();
  159.     return true;
  160. }
  161.  
  162.  
  163. function evernote_checkDocumentSaveStatus()
  164. {
  165.   if (enWebPersistenceThing.currentState == Components.interfaces.nsIWebBrowserPersist.PERSIST_STATE_SAVING) {
  166.     // still saving...do nothing
  167.     //dump("Still saving...\n");
  168.     return;
  169.   }
  170.   //dump("Done saving.  State is: " + enWebPersistenceThing.currentState + "\n");
  171.   //dump("Result is: " + enWebPersistenceThing.result + "\n");
  172.   
  173.   // save is finished, remove our interval timer
  174.   clearInterval(enSaveFinishedInterval);
  175.   
  176.   // send it to evernote
  177.   try {
  178.     var enClipper = Components.classes["@evernote.com/ENMacMozillaClipper;1"].createInstance(Components.interfaces.EvernoteMacMozillaClipper);
  179.     enClipper.clipFile(enSaveMainFile.path, content.document.title, content.document.location.href, enDocumentToClip.inputEncoding);
  180.     return;
  181.   } catch (e) {
  182.     dump("Exception trying to clip:" + e);
  183.   }
  184.  
  185.   // failed to clip with native lib, fall back to javascript clipper
  186.   evernote_javascriptClipperFallback();  
  187. }
  188.